# -*- coding: utf-8 -*-
'''
@authors Ricardo Ramos 6316 && Carlos Pereira 11112
@date 22 de Novembro de 2014
@obs: Criação de gráficos referentes
as estatisticas pretendidas
'''

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from pylab import *
from matplotlib import font_manager as fm
from matplotlib.transforms import Affine2D
from matplotlib.patches import Circle, Wedge, Polygon
from datetime import datetime, date
import csv
import os


def autolabel(rects):
	'''
	Método que adiciona o valor da barra no seu topo

	@param rects lista de barras do gráfico a colocar as labels 
	'''
    # attach some text labels
	for rect in rects:
		height = rect.get_height()
		ax.text(rect.get_x()+rect.get_width()/2., height, '%d'%int(height), ha='center', va='bottom')


def criar_grafico(labels, stats, subtitles, flag=False):	
	'''
	Método que constroi um grafico
	através dos parametros dados

	@labels lista de labels a atribuir as barras do gráfico
	@stats lista de valores com que cada barra vai ser contruida
	@subtitles lista com o titulo e a legenda do gráfico
	@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
	'''
	N = len(stats)
	std = []
	for i in labels:
		std.append(0)
	 	
	ind = np.arange(N)  # the x locations for the groups
	width = 0.6     # the width of the bars
	global ax
	fig, ax = plt.subplots()
	bar = ax.bar(ind + 2, stats, width, color='g', yerr=std)
	 #add some
	ax.set_ylabel(subtitles[0])
	ax.set_title(subtitles[1])
	ax.set_xticks((ind+width / 2) + 2)
	ax.set_xticklabels(labels,  rotation='vertical')
	autolabel(bar)
	plt.subplots_adjust(left=0.1, right=0.95, top=0.95, bottom=0.35)
	plt.show()


class Graficos_estatisticas ():
	def __init__(self, name, min1=1977, max1=2013):
		self.max = max1;
		self.min = min1;
		self.name = name;
		'''
		Classe que gera gráficos
		'''
		reader = csv.reader(open(self.name, "rb"))
		global labels_esta, ipc_esta
		labels_esta = []
		ipc_esta = []
		for row in reader:
			i = row[0].split(';')
			if int(i[0]) >= self.min and int(i[0]) <= self.max and i[1] != '':
				labels_esta.append(i[0])
				ipc_esta.append(float(i[1]))

	def ipc_graf(self, flag = False):
		'''
		Método que gera um gráfico para o indice de preços de Consumidor

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Valores de IPC'.decode('utf-8'))
		subtitles.append('Indice de Preços Consumidor'.decode('utf-8'))
		criar_grafico(labels_esta, ipc_esta, subtitles, flag)

	def inflacao_graf(self, flag = False):
		'''
		Método que gera um gráfico para o Indice de Taxa de Inflação

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Valores de Taxa de Inflação'.decode('utf-8'))
		subtitles.append('Indice de Taxa de Inflação'.decode('utf-8'))
		criar_grafico(labels_esta, ipc_esta, subtitles, flag)

	def remmin_graf(self, flag = False):
		'''
		Método que gera um gráfico para o Indice Remuneração Minima Mensal

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Valores da Remuneração Minima Mensal'.decode('utf-8'))
		subtitles.append('Indice Remuneração Minima Mensal'.decode('utf-8'))
		criar_grafico(labels_esta, ipc_esta, subtitles, flag)

	def remmax_graf(self, flag = False):
		'''
		Método que gera um gráfico para o Indice Remuneração Máxima Mensal

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Valores da Remuneração Máxima Mensal'.decode('utf-8'))
		subtitles.append('Indice Remuneração Máxima Mensal'.decode('utf-8'))
		criar_grafico(labels_esta, ipc_esta, subtitles, flag)

	def pib_graf(self, flag = False):
		'''
		Método que gera um gráfico para o Indice PIB

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Valores do Produto Interno Bruto'.decode('utf-8'))
		subtitles.append('Indice PIB'.decode('utf-8'))
		criar_grafico(labels_esta, ipc_esta, subtitles, flag)

	def rendanbruto_graf(self, flag = False):
		'''
		Método que gera um gráfico para o Indice de Rendimento Anual Nacional Bruto

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Valores de Rendimento Anual Nacional Bruto'.decode('utf-8'))
		subtitles.append('Indice de Rendimento Anual Nacional Bruto'.decode('utf-8'))
		criar_grafico(labels_esta, ipc_esta, subtitles, flag)

	def renddispbruto_graf(self, flag = False):
		'''
		Método que gera um gráfico para o Indice de Rendimento Disponivel Anual Bruto

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Valores de Rendimento Disponivel Anual Bruto'.decode('utf-8'))
		subtitles.append('Indice de Rendimento Disponivel Anual Bruto'.decode('utf-8'))
		criar_grafico(labels_esta, ipc_esta, subtitles, flag)

	def rempercapita_graf(self, flag = False):
		'''
		Método que gera um gráfico para o Indice de Remuneração per Capita

		@flag variavel booleana que define se o gráfico gera uma imagem .jpg, ou não
		'''
		subtitles = []
		subtitles.append('Valores de Remuneração per Capita'.decode('utf-8'))
		subtitles.append('Indice de Remuneração per Capita'.decode('utf-8'))
		criar_grafico(labels_esta, ipc_esta, subtitles, flag)


	
class Pontos_estatisticas ():
	def __init__(self, name, min1=1977, max1=2013):
		self.max = max1;
		self.min = min1;
		self.name = name;
		'''
		Classe que gera gráficos
		'''
		reader = csv.reader(open(self.name, "rb"))
		global labels_esta, ipc_esta
		labels_esta = []
		ipc_esta = []
		lista2 = []
		for row in reader:
			i = row[0].split(';')
			if int(i[0]) >= self.min and int(i[0]) <= self.max and i[1] != '':
				labels_esta.append(i[0])
				ipc_esta.append(float(i[1]))
				lista2.append(float(i[2]))

		fig, ax = plt.subplots()
		ax.set_ylabel('Valores de Evolucao de Salarios')
		ax.set_title("Indice de Evolucao de Salarios")
		plt.plot(labels_esta, ipc_esta)
		plt.plot(labels_esta, lista2)
		plt.show()

if __name__ == '__main__':
	main()